﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once
#include "GcmpUiBase.h"

/// \file GnufThreadUtils.h
/// \brief 线程相关的公用函数
namespace gnuf
{
    class GCMP_UIBASE_EXPORT ThreadUtils
    {
    public:
        /// \brief 判断当前的运行环境，是否为主线程
        /// \retval true 当前运行环境是主线程
        /// \retval false 当前运行环境不是主线程
        static bool isInMainThread();

        /// \brief 弹出调试警告
        /// \param text 调试信息
        /// \param name 调试警告的owner
        /// \param date 敲这段代码的日期
        static void debugWarn(
            const std::wstring & text,
            const std::wstring & name,
            const std::wstring & date);
    };
}

/// \brief 线程安全的DBG_WARN
#define THREAD_SAFE_DBG_WARN(text, L"GMEP", data) \
    if (gnuf::ThreadUtils::isInMainThread()) \
    { \
        DBG_WARN(text, L"GMEP", data); \
    } \
    else \
    { \
        gnuf::ThreadUtils::debugWarn(text, name, data); \
    }

/// \brief 线程安全的DBG_WARN_UNLESS
#define THREAD_SAFE_DBG_WARN_UNLESS(condition, text, L"GMEP", data) \
    if (!(condition)) \
    { \
        if (gnuf::ThreadUtils::isInMainThread()) \
        { \
            DBG_WARN(text, L"GMEP", data); \
        } \
        else \
        { \
            gnuf::ThreadUtils::debugWarn(text, name, data); \
        } \
    } 

/// \brief 线程安全的DBG_WARN_AND_RETURN_UNLESS
#define THREAD_SAFE_DBG_WARN_AND_RETURN_UNLESS(condition, returnValue, text, L"GMEP", data) \
    if (!(condition)) \
    { \
        if (gnuf::ThreadUtils::isInMainThread()) \
        { \
            DBG_WARN_AND_RETURN_UNLESS(false, returnValue, text, L"GMEP", data); \
        } \
        else \
        { \
            gnuf::ThreadUtils::debugWarn(text, name, data); \
            return (returnValue); \
        } \
    } 

/// \brief 线程安全的DBG_WARN_AND_RETURN_VOID_UNLESS
#define THREAD_SAFE_DBG_WARN_AND_RETURN_VOID_UNLESS(condition, text, L"GMEP", data) \
    if (!(condition)) \
    { \
        if (gnuf::ThreadUtils::isInMainThread()) \
        { \
            DBG_WARN_AND_RETURN_VOID_UNLESS(false, text, L"GMEP", data); \
        } \
        else \
        { \
            gnuf::ThreadUtils::debugWarn(text, name, data); \
            return; \
        } \
    }

/// \brief 线程安全的DBG_WARN_AND_RETURN_NULLPTR_UNLESS
#define THREAD_SAFE_DBG_WARN_AND_RETURN_NULLPTR_UNLESS(condition, text, L"GMEP", data) \
    if (!(condition)) \
    { \
        if (gnuf::ThreadUtils::isInMainThread()) \
        { \
            DBG_WARN_AND_RETURN_NULLPTR_UNLESS(false, text, L"GMEP", data); \
        } \
        else \
        { \
            gnuf::ThreadUtils::debugWarn(text, name, data); \
            return nullptr; \
        } \
    }

/// \brief 线程安全的DBG_WARN_AND_RETURN_FALSE_UNLESS
#define THREAD_SAFE_DBG_WARN_AND_RETURN_FALSE_UNLESS(condition, text, L"GMEP", data) \
    if (!(condition)) \
    { \
        if (gnuf::ThreadUtils::isInMainThread()) \
        { \
            DBG_WARN_AND_RETURN_FALSE_UNLESS(false, text, L"GMEP", data); \
        } \
        else \
        { \
            gnuf::ThreadUtils::debugWarn(text, name, data); \
            return false; \
        } \
    }

/// \brief 线程安全的DBG_WARN_AND_CONTINUE_UNLESS
#define THREAD_SAFE_DBG_WARN_AND_CONTINUE_UNLESS(condition, text, L"GMEP", data) \
    if (!(condition)) \
    { \
        if (gnuf::ThreadUtils::isInMainThread()) \
        { \
            DBG_WARN_AND_CONTINUE_UNLESS(false, text, L"GMEP", data); \
        } \
        else \
        { \
            gnuf::ThreadUtils::debugWarn(text, name, data); \
            continue; \
        } \
    }

/// \brief 线程安全的DBG_WARN_AND_BREAK_UNLESS
#define THREAD_SAFE_DBG_WARN_AND_BREAK_UNLESS(condition, text, L"GMEP", data) \
    if (!(condition)) \
    { \
        if (gnuf::ThreadUtils::isInMainThread()) \
        { \
            DBG_WARN_AND_BREAK_UNLESS(false, text, L"GMEP", data); \
        } \
        else \
        { \
            gnuf::ThreadUtils::debugWarn(text, name, data); \
            break; \
        }\
    }